#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include "../../src/cli.h"
#include "../../src/conexion.h"
#include "../../src/utils.h"

#define MAX_CANT_MENSAJES 10
#define MS_ENTRE_MENSAJES 1000

void imprimir(int codigo, void* data, int size, void* objeto){
	if(codigo == CON_DATOS_RECIBIDOS) {
		printf("CLIENTE Texto recibido. Codigo %s. ", conexion_describir_status(codigo));
		printf("Longitud: %d. Mensaje: \"%s\".\n", size, (char*)data);
	}
}

void detectar_cierre(int codigo, void* data, int size, void* objeto) {
	if (codigo == CON_DESCONECTADO || codigo == CON_ERROR || codigo == CON_CERRADO) {
		printf("CLIENTE Cerrando sistema. Codigo recibido: '%s'.\n", conexion_describir_status(codigo));
		char* continuar = (char*)objeto;
		*continuar = 0;
	}
}

int main(int argc, char* argv[]) {
	
	if (argc != 2) {
		printf("Cantidad de argumentos inválida. Formato de ejecucion: ./client <servidor>:<puerto>\n");
		return 1;
	}
	else {
		cli_iniciar();
		
		int obj_dummy = 777;
		char continuar = 1;
		cli_suscribir(imprimir, &obj_dummy);
		cli_suscribir(detectar_cierre, &continuar);
		cli_conectar(argv[1]);

		int i = 0;
		while (continuar && i < MAX_CANT_MENSAJES) {
			char mensaje[50];
			sprintf(mensaje, "msg.%d", i++);
			printf("CLIENTE Enviando mensaje al servidor. Mensaje: '%s'\n", mensaje);
			cli_enviar(mensaje, strlen(mensaje)+1);
			cli_procesar();
			if (continuar)
				utils_mssleep(MS_ENTRE_MENSAJES);
		}
		if (i == MAX_CANT_MENSAJES) {
			printf("CLIENTE Desconectando del servidor por exceso de mensajes.\n"); 
			cli_desconectar();
		}
			
		cli_dessuscribir(&obj_dummy);
		cli_dessuscribir(&continuar);
		cli_terminar();
		return 0;
	}
}

